from enum import Enum

class SearchStrategy(Enum):
    """检索策略"""
    VECTOR = "vector"    # 单纯向量检索
    CASCADE = "cascade"  # 级联检索：优先BM25检索，无结果再用向量
    RERANK = "rerank"    # 重排序：向量召回，BM25重排

class Config:
    
    # 文件和目录配置
    DB_DIR = "search_index"
    DB_NAME = "documents.db"
    UPLOAD_DIR = "uploads"
    
    # 向量检索配置
    VECTOR_DIM = 4096
    # 不同文档类型的相似度阈值
    MIN_VECTOR_SCORE_PARAGRAPH = 0.80  # 段落检索阈值（较低，召回更多）
    MIN_VECTOR_SCORE_QA = 0.90         # 问答对检索阈值（较高，更精确）
    MIN_VECTOR_SCORE = 0.90            # 默认向量检索阈值
    DEFAULT_SEARCH_STRATEGY = SearchStrategy.VECTOR
    
    # BM25配置
    BM25_THRESHOLD = 5
    
    # UDP配置
    UDP_BUFFER_SIZE = 1024
    UDP_MAX_RETRIES = 3
    UDP_TIMEOUT = 2
    UDP_MAX_PACKET_SIZE = 65507  # UDP最大包大小
    
    # 文档处理配置
    MAX_CHUNK_SIZE = 512
    MIN_CHUNK_SIZE = 30
    CHUNK_OVERLAP = 30
    CHUNK_SIZES = [256, 128]  # 从大到小排序的切分大小
    
    # 讯飞 API 配置
    XUNFEI_APPID = "feea4f02"
    XUNFEI_API_SECRET = "N2I1NmRmM2YzOWNjMTExOGRkODI0NTA3"
    XUNFEI_API_KEY = "5467746317b42242d384797036bc46ca"
    VECTOR_REQUEST_TIMEOUT = 2  # seconds
    
    # 索引文件配置
    FAISS_INDEX_FILE = "faiss.index"
    BM25_INDEX_FILE = "bm25.pkl"
    
    # 缓存配置
    ENABLE_CACHE = True
    CACHE_DIR = "search_cache"
    CACHE_FILE = "query_cache.pkl"
    
    # 检索配置
    DEFAULT_TOP_K = 1
    RERANK_EXPAND_FACTOR = 3  # 重排序时扩大候选集的倍数 
    
    # TCP配置
    TCP_SERVER_HOST = "0.0.0.0"  # 服务端监听地址
    # TCP_CLIENT_HOST = "10.7.5.110"  # 客户端连接地址
    TCP_CLIENT_HOST = "localhost"  # 客户端连接地址
    TCP_PORT = 6032
    TCP_BUFFER_SIZE = 65536
    
    # 文档切分配置
    SPLIT_MODES = ["rule", "qa", "qa_vector", "hybrid"]  # 移除语义模式
    DEFAULT_SPLIT_MODE = "hybrid"  # 混合模式：段落+问答对共存
    
    # 批量文档处理配置
    BATCH_PROCESS_ENABLE = True
    MAX_ZIP_SIZE = 50 * 1024 * 1024  # 50MB ZIP文件大小限制
    MAX_FILES_PER_BATCH = 100        # 单次批处理最大文件数
    
    # QA切分配置
    QA_PATTERN = r"(\d+、.*?(?:回[答复]：|答：).*?)(?=\d+、|\Z)"  # 支持更灵活的问答格式
    
    # 大模型配置
    LLM_MODEL_ID = "ep-20250210173557-jbqzq"
    LLM_API_KEY = "ff253498-99ea-40a7-875a-f45f517887c5"
    LLM_BASE_URL = "https://ark.cn-beijing.volces.com/api/v3"

    # 段落问题生成配置
    PARAGRAPH_QUESTION_MODE = "original"  # "original" 或 "chunked"
    # original: 对原始段落生成问题（信息完整但可能冗余）
    # chunked: 对切分后的段落生成问题（聚焦但可能缺少上下文）
    
    PARAGRAPH_QUESTION_PROMPT = """请仔细阅读以下段落，从中提取1-3个最核心的问题。这些问题应该：

1. 抓住段落的主要信息点
2. 是用户可能会问的问题形式
3. 问题要具体且有针对性
4. 避免过于宽泛的问题

段落内容：
{paragraph}

请直接输出问题，每行一个问题，不要编号或其他格式：
""" 

    # Embedding 配置
    EMBEDDING_TYPE = "douban"  # "xunfei" 或 "douban"
    
    # 豆包API配置
    ARK_API_KEY = "ff253498-99ea-40a7-875a-f45f517887c5"  # 直接设置 API key
    # 或者从环境变量获取
    # ARK_API_KEY = os.getenv("ARK_API_KEY", "ff253498-99ea-40a7-875a-f45f517887c5")
    ARK_BASE_URL = "https://ark.cn-beijing.volces.com/api/v3"
    ARK_MODEL = "ep-20250828192710-6jd66"
    
    # ... 其他配置 ... 
